package com.zhengbing.tj.common;

import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * Spring上下文工具类
 * 实现ApplicationContextAware接口，提供静态方法获取Spring容器中的Bean实例
 * 用于在非Spring管理的类中获取Bean对象
 * 
 * @author zhengbing
 * @date 2025-07-29
 */
@Component
public class SpringContextUtil implements ApplicationContextAware {
    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext context) {
        applicationContext = context;
    }

    /**
     * 获取Spring容器中的Bean
     * 通过类型获取Spring容器中注册的Bean实例，支持泛型类型安全
     * 
     * @param requiredType Bean的类型Class对象
     * @param <T> Bean的类型参数
     * @return 对应类型的Bean实例
     * @throws org.springframework.beans.BeansException 如果Bean不存在或类型不匹配
     */
    public static <T> T getBean(Class<T> requiredType) {
        return applicationContext.getBean(requiredType);
    }

    /**
     * 根据名称获取Spring容器中的Bean
     * 通过Bean名称获取Spring容器中注册的Bean实例，返回Object类型需要强制转换
     * 
     * @param beanName Bean的名称（在@Component、@Service等注解中指定的名称）
     * @return 对应名称的Bean实例
     * @throws org.springframework.beans.BeansException 如果Bean不存在
     */
    public static Object getBean(String beanName) {
        return applicationContext.getBean(beanName);
    }
}